#include <iostream>
using namespace std;

class A{
  int _a;
  int _b;

public:
  A(int a, int b)
    :_a(a)
    ,_b(b)
  {}
};

void Test2();

int main(){
  Test2();
  return 0;
}

void Test2(){
    //malloc：1.堆上申请空间
    A *p1 = (A*)malloc(sizeof(A));
    //new：1.堆上申请空间 2.调用构造函数初始化对象
    //A *p2 = new A; //不传参数调用默认构造函数
    //A *p3 = new A(10); //还可以给构造函数传参
    //A *p4 = new A[5]; //可以连续创建多个对象，这些对象都会调用构造函数初始化
    //C++11支持申请数组时{}直接初始化，C++98不支持
    A *p5 = new A[5]{{1,10}, {2,20}, {3, 30}}; //隐式类型转换优化成直接调构造
    A *p6 = new A[5]{A(1,10), A(2,20), A(3,30), A(2,20), A(3,30)}; //拷贝构造优化成直接调构造
    
    //free：1.释放堆空间
    free(p1);
    //delete：1.调用析构函数清理对象占用的资源 2.释放堆空间
    delete p2;
    delete p3;
    delete[] p4; //释放连续存储的多个对象，这些对象在销毁前都会调用析构函数清理资源
    delete[] p5; //[]要配对使用，否则程序可能崩溃
    delete[] p6; //[]要配对使用，否则程序可能崩溃
}
